<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>越近越好 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/decay-functions.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/decay-functions.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/decay-functions.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/decay-functions.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="search-in-depth.html">深入搜索</a></span>
»
<span class="breadcrumb-link"><a href="controlling-relevance.html">控制相关度</a></span>
»
<span class="breadcrumb-node">越近越好</span>
</div>
<div class="navheader">
<span class="prev">
<a href="random-scoring.html">« 随机评分</a>
</span>
<span class="next">
<a href="Understanding-the-price-Clause.html">理解 price 价格语句 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="decay-functions"></a>越近越好<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/170_Relevance/60_Decay_functions.asciidoc">edit</a>
</h2>
</div></div></div>
<p>很多变量都可以影响用户对于度假屋的选择，也许用户希望离市中心近点，但如果价格足够便宜，也有可能选择一个更远的住处，也有可能反过来是正确的：愿意为最好的位置付更多的价钱。</p>
<p>如果我们添加过滤器排除所有市中心方圆 1 千米以外的度假屋，或排除所有每晚价格超过 £100 英镑的，我们可能会将用户愿意考虑妥协的那些选择排除在外。</p>
<p><code class="literal">function_score</code> 查询会提供一组 <em>衰减函数（decay functions）</em> ，让我们有能力在两个滑动标准，如地点和价格，之间权衡。</p>
<p>有三种衰减函数—— <code class="literal">linear</code> 、 <code class="literal">exp</code> 和 <code class="literal">gauss</code> （线性、指数和高斯函数），它们可以操作数值、时间以及经纬度地理坐标点这样的字段。所有三个函数都能接受以下参数：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">origin</code>
</span>
</dt>
<dd>
<em>中心点</em> 或字段可能的最佳值，落在原点 <code class="literal">origin</code> 上的文档评分 <code class="literal">_score</code> 为满分 <code class="literal">1.0</code> 。
</dd>
<dt>
<span class="term">
<code class="literal">scale</code>
</span>
</dt>
<dd>
衰减率，即一个文档从原点 <code class="literal">origin</code> 下落时，评分 <code class="literal">_score</code> 改变的速度。（例如，每 £10 欧元或每 100 米）。
</dd>
<dt>
<span class="term">
<code class="literal">decay</code>
</span>
</dt>
<dd>
从原点 <code class="literal">origin</code> 衰减到 <code class="literal">scale</code> 所得的评分 <code class="literal">_score</code> ，默认值为 <code class="literal">0.5</code> 。
</dd>
<dt>
<span class="term">
<code class="literal">offset</code>
</span>
</dt>
<dd>
以原点 <code class="literal">origin</code> 为中心点，为其设置一个非零的偏移量 <code class="literal">offset</code> 覆盖一个范围，而不只是单个原点。在范围 <code class="literal">-offset &lt;= origin &lt;= +offset</code> 内的所有评分 <code class="literal">_score</code> 都是 <code class="literal">1.0</code> 。
</dd>
</dl>
</div>
<p>这三个函数的唯一区别就是它们衰减曲线的形状，用图来说明会更为直观（参见 <a class="xref" href="decay-functions.html#img-decay-functions" title="衰减函数曲线">Figure 33, “衰减函数曲线”</a> ）。</p>
<div id="img-decay-functions" class="imageblock">
<div class="content">
<img src="../images/elas_1705.png" alt="衰减函数曲线">
</div>
<div class="title">Figure 33. 衰减函数曲线</div>
</div>
<p>图 <a class="xref" href="decay-functions.html#img-decay-functions" title="衰减函数曲线">Figure 33, “衰减函数曲线”</a> 中所有曲线的原点 <code class="literal">origin</code> （即中心点）的值都是 <code class="literal">40</code> ， <code class="literal">offset</code> 是 <code class="literal">5</code> ，也就是在范围 <code class="literal">40 - 5 &lt;= value &lt;= 40 + 5</code> 内的所有值都会被当作原点 <code class="literal">origin</code> 处理——所有这些点的评分都是满分 <code class="literal">1.0</code> 。</p>
<p>在此范围之外，评分开始衰减，衰减率由 <code class="literal">scale</code> 值（此例中的值为 <code class="literal">5</code> ）和 衰减值 <code class="literal">decay</code> （此例中为默认值 <code class="literal">0.5</code> ）共同决定。结果是所有三个曲线在 <code class="literal">origin +/- (offset + scale)</code> 处的评分都是 <code class="literal">0.5</code> ，即点 <code class="literal">30</code> 和 <code class="literal">50</code> 处。</p>
<p><code class="literal">linear</code> 、 <code class="literal">exp</code> 和 <code class="literal">gauss</code> （线性、指数和高斯）函数三者之间的区别在于范围（ <code class="literal">origin +/- (offset + scale)</code> ）之外的曲线形状：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">linear</code> 线性函数是条直线，一旦直线与横轴 0 相交，所有其他值的评分都是 <code class="literal">0.0</code> 。
</li>
<li class="listitem">
<code class="literal">exp</code> 指数函数是先剧烈衰减然后变缓。
</li>
<li class="listitem">
<code class="literal">gauss</code> 高斯函数是钟形的——它的衰减速率是先缓慢，然后变快，最后又放缓。
</li>
</ul>
</div>
<p>选择曲线的依据完全由期望评分 <code class="literal">_score</code> 的衰减速率来决定，即距原点 <code class="literal">origin</code> 的值。</p>
<p>回到我们的例子：用户希望租一个离伦敦市中心近（ <code class="literal">{ "lat": 51.50, "lon": 0.12}</code> ）且每晚不超过 £100 英镑的度假屋，而且与距离相比，我们的用户对价格更为敏感，这样查询可以写成：</p>
<div class="pre_wrapper lang-json">
<pre class="programlisting prettyprint lang-json">GET /_search
{
  "query": {
    "function_score": {
      "functions": [
        {
          "gauss": {
            "location": { <a id="CO119-1"></a><i class="conum" data-value="1"></i>
              "origin": { "lat": 51.5, "lon": 0.12 },
              "offset": "2km",
              "scale":  "3km"
            }
          }
        },
        {
          "gauss": {
            "price": { <a id="CO119-2"></a><i class="conum" data-value="2"></i>
              "origin": "50", <a id="CO119-3"></a><i class="conum" data-value="3"></i>
              "offset": "50",
              "scale":  "20"
            }
          },
          "weight": 2 <a id="CO119-4"></a><i class="conum" data-value="4"></i>
        }
      ]
    }
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO119-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">location</code> 字段以地理坐标点 <code class="literal">geo_point</code> 映射。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO119-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">price</code> 字段是数值。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO119-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>参见 <a class="xref" href="Understanding-the-price-Clause.html" title="理解 price 价格语句">理解价格语句</a> ，理解 <code class="literal">origin</code> 为什么是 <code class="literal">50</code> 而不是 <code class="literal">100</code> 。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO119-4"><i class="conum" data-value="4"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">price</code> 语句是 <code class="literal">location</code> 语句权重的两倍。</p>
</td>
</tr>
</table>
</div>
<p><code class="literal">location</code> 语句可以简单理解为：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
以伦敦市中作为原点 <code class="literal">origin</code> 。
</li>
<li class="listitem">
所有距原点 <code class="literal">origin</code> <code class="literal">2km</code> 范围内的位置的评分是 <code class="literal">1.0</code> 。
</li>
<li class="listitem">
距中心 <code class="literal">5km</code> （ <code class="literal">offset + scale</code> ）的位置的评分是 <code class="literal">0.5</code> 。
</li>
</ul>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="random-scoring.html">« 随机评分</a>
</span>
<span class="next">
<a href="Understanding-the-price-Clause.html">理解 price 价格语句 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>